package org.jvm.classloader;

import sun.misc.Launcher;

import java.net.URL;
import java.net.URLClassLoader;

/**
 * classloader 自定义及使用
 */
public class MyClassLoaderTest {
    public static void main(String[] args) {
        System.out.println(MyClassLoaderTest.class.getClassLoader());
        System.out.println(MyClassLoaderTest.class.getClassLoader().getParent());
        System.out.println(MyClassLoaderTest.class.getClassLoader().getParent().getParent());
        printClassLoaderUrl();

    }

    /**
     * 打印出不同classloader加载jar包路径
     */
    public  static void printClassLoaderUrl(){
        //首先是启动类加载器
        System.out.println("启动类加载器的加载路径： ");
        URL[] urls = Launcher.getBootstrapClassPath().getURLs();
        for(URL url : urls)
        {
            System.out.println(url);
        }
        System.out.println("=======================================================");


        System.out.println("扩展类加载器的路径： ");
        //然后是扩展类加载器，获取方式是获取系统类加载器(AppClassLoader)的父加载器
        //（注意这就需要开启双亲委派模型）
        URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();
        urls = extClassLoader.getURLs();
        for(URL url : urls)
        {
            System.out.println(url);
        }
        System.out.println("========================================================");

        //应用程序类加载器
        System.out.println("应用程序类加载器的路径： ");
        URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
        urls = appClassLoader.getURLs();
        for(URL url : urls)
        {
            System.out.println(url);
        }
    }
}
